package day03.dproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 执行句柄
// welcome, xxx
// 每个人登录后，都会显示xxxx
// 每个方法调用执行的时候，都会做xxxx
// JDK的动态代理
public class DynamicProxy implements InvocationHandler {

    private ITarget target;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object o = null;
        // 反射reflect
        // 执行target对象的 method方法， 参数是 args
        try {
            System.out.println("before收费1");
            o = method.invoke(target, args);
            System.out.println("after收费1");
        } catch (Exception e) {
            System.out.println("Catch收费1");
        } finally {
            System.out.println("finally收费1");
        }

        return o;
    }

    public ITarget netInstance() {
        // jdk 用接口创建了一个代理对象
        return (ITarget) Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(), new Class[]{ITarget.class}, this);
    }

    public ITarget getTarget() {
        return target;
    }

    public void setTarget(ITarget target) {
        this.target = target;
    }


}
